package DAO;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import Hibernate.HibernateUtil;
import Negocio.Encomienda;


public class HibernateEncomiendaDAO {
	private static HibernateEncomiendaDAO instancia = null;
	private static SessionFactory sf = null;
	
	
	public static HibernateEncomiendaDAO getInstancia(){
		if(instancia == null){
			instancia = new HibernateEncomiendaDAO();
			sf = HibernateUtil.getSessionFactory();
		}
		return instancia;
	}
	
	public Encomienda getEncomienda(int id){
        try {
        	Session session=sf.openSession();
            session.beginTransaction();
            Encomienda encomienda = (Encomienda) (session.createQuery("from Encomienda enc left join fetch enc.itemsEnvios where enc.idEncomienda = ?").setInteger(0, id).uniqueResult());
            session.getTransaction().commit();
            session.close();
            return encomienda;
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error al cargar la Encomienda");
        }
        return null;
	}

	public void grabarEncomienda(Encomienda encomienda) {
		try{
		Session session = sf.openSession();
		session.beginTransaction();
		session.saveOrUpdate(encomienda);
		session.flush();
		session.getTransaction().commit();
		session.close();
		}catch(Exception e){
			System.out.println(e);
			System.out.println("Error al grabar una Encomienda");
		}
	}
	
	public void updateEncomienda(Encomienda encomienda){
		try{
		Session session = sf.openSession();
		session.beginTransaction();
		session.saveOrUpdate(encomienda);
		session.flush();
		session.getTransaction().commit();
		session.close();
		}catch (Exception e){
			System.out.println(e);
            System.out.println("Error al actualizar una Encomienda");
		}
		
	}
	
	public List<Encomienda> getListaEncomiendas(){
		try{
			Session session = sf.openSession();
			session.beginTransaction();
			Query q = session.createQuery("from Encomienda e left join fetch e.itemsEnvios where e.encomiendaCompleta = False");
			List<Encomienda> lista = q.list();
			session.getTransaction().commit();
			session.flush();
			session.close();
			return lista;
		}catch (Exception e){
			System.out.println(e);
			System.out.println("Error al cargar listado de Encomiendas");
		}
		return null;
	}

}
